home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
t_os
/
dir_test
/
dir_test.asm
next >
Wrap
Assembly Source File
|
1991-10-18
|
5KB
|
284 lines
.xlist
STDIN equ 0 ;
STDOUT equ 1 ;
STDERR equ 2 ;
CR equ 0dh
LF equ 0ah
TAB equ 09h
ESCP equ 1bh
EOT equ '$'
EOF equ 1ah
PSP_SEL equ 04h
TBIOS_SEL equ 0110h
VRAM1_SEL equ 120h
VRAM2_SEL equ 128h
FALSE equ 0
TRUE equ (not FALSE)
.list
;
doscall macro func
ifnb <func>
if func ge 100h
mov ax,func
else
mov ah,func
endif
endif
int 21h
endm
;
G_work_size equ 15300h
EGB equ fword ptr fs:[20h]
;
graphic_work dd ?
;
M_work_size equ 4096d
MUS equ fword ptr fs:[40h]
MSN equ fword ptr fs:[48h]
;
mause_work dd ?
;
file_msg dw 28
locate_y dw 80
dw 14
file_put db 12 dup (0)
db 1 dup (0)
file_type1 db 1 dup (0)
db 0
;
file_msdos db 21 dup (0)
file_inf db 0
file_time dw 0
file_date dw 0
file_size db 4 dup (0)
file_name db 12 dup (0)
db 0
;
file_space db 12 dup (0)
db 0
;
pass_msg dw 24
dw 24
file_pass_s dw 09
file_pass db 24 dup (0)
db 0
;
NextPrmOffset dd ?
;
wait_msg dw 0
dw 16
dw 2
db '<>'
db 0
;
err_msg0 dw 0
dw 32
dw 15
db 'ドライブ番号が無効です。'
;
err_msg1 dw 0
dw 48
dw 15
db 'パスが無効です。'
;
err_msg2 dw 0
dw 64
dw 11
db '一致しない。'
;
mause_y dw 80
mause_x dw 80
;
;=======< FILE display テスト プログラム >========
start:
mov ax,0004h ; コマンドライン領域のセレクタの設定
mov fs,ax ;
mov esi,81h ; esi=コマンド領域のポインタ
mov edi,offset file_pass ; edx=表示領域のポインタ
movzx ecx,byte ptr fs:[esi-1] ; ecx=コマンド文字数
mov byte ptr fs:[esi+ecx],0 ; コマンド領域の最後に区切り文字セット
mov ds:[file_pass_s],cx ; 文字数セット
cmdprm:
lods byte ptr fs:[esi] ; al=コマンド領域から一文字取り出す
cmp al,' ' ; 空白なら読み飛ばす
je cmdprm ;
cmp al,TAB ; TABなら読み飛ばす
je cmdprm ;
stosb ; 表示領域=al
cmp al,0 ; 終了ならMAINへ
je main ;
jmp short cmdprm ;
;
main:
mov ax,0110h ; BIOS領域のセレクタの設定
mov fs,ax ;
;
sub esp,G_work_size ; スタックにEGB用作業領域の確保
mov graphic_work,esp ;
mov edi,esp ; EGBの初期化
mov ecx,G_work_size ;
mov ah,00h ;
call EGB ;
;
mov ah,01h ; 640*480 256色 モードにする
mov al,00h ;
mov edx,12d ;
call EGB ;
;
mov ah,05h ; 書き込みページを0にする
mov al,00h ;
call EGB ;
;
mov ah,06h ; 表示ページを0にする
mov al,00h ;
mov edx,00000001h ;
call EGB ;
;
mov ah,08h ; 前景色設定
mov al,00h ;
mov edx,00ffffffh ;
call EGB ;
;
mov ah,08h ; 背景色設定
mov al,01h ;
mov edx,00000fffh ;
call EGB ;
;
mov ah,17h ; 文字間隔設
mov dx,0001h ;
call EGB ;
;
mov ah,19h ; 文字の字体設定
mov dx,0001h ;
call EGB ;
;
mov ax,0a09h ; 描画モードの設定
call EGB ;
;
mov ah,20h ; 画面クリア
call EGB ;
;
mov esi,offset pass_msg ; パラメタの表示
mov edi,graphic_work ;
mov ah,60h ;
call EGB ;
;
;=======< 先頭のファイル検索 >========
mov edx,offset file_msdos
doscall 1ah
;
mov edx,offset file_pass ; 最初に一致するファイル名の検索
mov ecx,0000ffffh ;
doscall 4eh ;
;
cmp ax,02d
je short err1
cmp ax,18d
je short err2
;
mov esi,offset file_msg
jmp short msgput1
err1:
mov esi,offset err_msg1
jmp short msgput1
err2:
mov esi,offset err_msg2
msgput1:
mov edi,graphic_work
mov ah,60h
call EGB
;
;=======< ファイルが無くなる迄ファイル検索 >========
dirstart:
mov edx,offset file_pass ; 次に一致するファイル名の検索
doscall 4fh ;
;
cmp ax,18d ; 終了判定
je dirend ;
;
mov esi,offset file_name ; ファイル名表示領域に複写
mov edi,offset file_put ; esi=ファイル名格納場所
mov ecx,12d ; edi=ファイル名表示領域
cld ; ecx=文字数
inc ecx ;
rep movsb ;
;
mov esi,offset file_space ; ファイル名格納領域を初期化
mov edi,offset file_name ; esi=ファイル名初期値
mov ecx,12d ; edi=ファイル名格納
cld ; ecx=文字数
inc ecx ;
rep movsb ;
;
mov ds:[file_type1],' ' ;
;
mov ah,file_inf ; ファイル属性設定
and ah,10h ;
cmp ah,10h ;
jne short setnt1 ;
mov ds:[file_type1],'d' ;
setnt1:
;
dirput:
mov esi,offset file_msg ; ファイル名表示
mov edi,graphic_work ;
mov ah,60h ;
call EGB ;
mov ax,16d ;
add ds:[locate_y],ax ;
mov ax,400d ;
cmp ds:[locate_y],ax ;
je short ly ;
jmp dirstart ;
ly: mov ax,80d ;
mov ds:[locate_y],ax ;
mov ax,100d ;
add ds:[file_msg],136d ;
jmp dirstart
;
dirend:
sub esp,M_work_size ; スタックに作業領域を獲得する。
mov mause_work,esp ;
mov edi,esp ;
mov ecx,M_work_size ;
mov ah,00h ; マウスの初期化を行う
call MUS ;
;
mov ah,0dh ; マウスの表示画面の設定
mov al,0d ; 表示ページ0
mov edx,12d ; 画面モード12
call MUS ;
;
mov ah,02h ; マウスの表示
mov al,1d ;
call MUS ;
;
msta:
call MSN ; マウスの状態監視
;
mov ah,03h ; マウスの状態取り込み
call MUS ;
;
mov esi,offset wait_msg
mov edi,graphic_work
mov ah,60h
call EGB
;
cmp ch,00h ; マウスボタンが押されたか
je short msta ;
;
mov ah,01h ; マウス動作終了
call MUS ;
;
;
;=======< MS-DOSに戻る >========
doscall 4c00h
ret
;
.stack 20000h * 4
;
end start